#!/usr/bin/env python
# -*- coding: utf-8; -*-

from django.template import Library
from django.urls import reverse

from web import models
"""
项目页面,许多地方都需要提供个人项目的展示和跳转,而且这些事件应该要求实时
的后台传输项目数据避免数据有误. 而每个展示页面的模板都重复的编写项目展示
部分效率过低,为了提高效率,可以使用模板的标签系统来做重复性动作.

项目的展示html部分比较复杂,考虑使用 inclusion_tag, 参数中需要提供额外的html
文件,自定义的标签函数的"字典"返回值会以参数html文件内容为基础渲染并返回

自定义模板的标签、过滤器应保存在名为 templatetags 的目录(需要添加
__init__.py 文件, 且目录与 models.py views.py 同级)内一些模块文件中,模块文
件的名字即用来加载 tags 的名字. {% load %} 语句会加载自定义标签名字指定的
python 模块中的标签或过滤器(而不是应用)

注意
1. 模板文件中的 {% load module_name %} 语句中的 module_name 为
   templatetags包内 python 模块文件名.
2. 项目新增 templatetags 目录和自定义标签模块后，需要重启django服务
   或者修改SETTINGS.TEMPLATES 
3. 自定义标签对应的模板文件中的变量从标签函数 return 出去的的上下文字典内获得。 


执行步骤
1. 在应用目录内创建与 models.py 同级的 templatetags 目录，以及对应子文件
    __init__.py
2. 确认应用在设置文件中注册：INSTALLED_APP
3. 在 templatetags 目录内编写定义标签的python模块文件，如本文件 project.py
4. 编写自定义标签的渲染模板HTML文件，比如 all_project 标签对应的 
   'inclusion/all_project.html', 该文件应放置在应用目录的 tempaltes 子目录中，
5. 模板中 {% load module_name %}，使用标签则与默认方式一致
6. 重启服务
"""

# 1. 实例化得到 register
register = Library()


# 2. 调用 register 的 inclusion_tag 方法, 装饰自定义标签函数
@register.inclusion_tag('inclusion/all_project.html')
def all_project(request):
    """ 返回与用户有关的项目列表，并进行格式渲染 """
    # 母板 manage.py 中应包含内容:
    #   {% load project %}
    #   {% all_project request %}
    # 其中调用标签语句中的 request 参数, 由后台 render 函数处理模板对象时赋
    # 值, 视图函数 project_list 的第一个参数即是 request

    # 1. 获取用户创建的所有项目
    my_project_list = models.Project.objects.filter(
        creator=request.tracer.user)
    # 2. 获取用户参与的所有项目
    join_project_list = models.ProjectUser.objects.filter(
        user=request.tracer.user)

    return {'my': my_project_list, 'join': join_project_list,
            'request': request}


@register.inclusion_tag('inclusion/manage_menu_list.html')
def manage_menu_list(request):
    data_list = [
        {
            'title': '概览',
            'url': reverse("dashboard", kwargs={'project_id': request.tracer.project.id})
        },
        {
            'title': '问题',
            'url': reverse("issues", kwargs={'project_id': request.tracer.project.id})
        },
        {
            'title': '统计',
            'url': reverse("statistics", kwargs={'project_id': request.tracer.project.id})
        },
        {
            'title': 'wiki',
            'url': reverse("wiki", kwargs={'project_id': request.tracer.project.id})
        },
        {
            'title': '文件',
            'url': reverse("file", kwargs={'project_id': request.tracer.project.id})
        },
        {
            'title': '配置',
            'url': reverse("settings", kwargs={'project_id': request.tracer.project.id})
        },
    ]

    # 对当前访问的项目菜单添加高亮
    for item in data_list:
        # 当前用户访问的URL：request.path_info:  /manage/4/issues/xxx/add/
        if request.path_info.startswith(item['url']):
            item['class'] = 'active'

    return {'data_list': data_list}
